package pattern.singleton.demo4;

/**
 * @Author suzhengzhuang
 * @Email: suzhengzhuang@icloud.com
 * @Date 2024/4/17 11:02
 * @PackageName:pattern.singleton.demo4
 * @ClassName: Singleton
 * @Description: TODO 懒汉式-双重检查锁方式
 * @Version 1.0
 */
public class Singleton {

    // 私有构造方法
    private Singleton() {}

    // 声明Singleton类型的变量 volatile是防止jvm指令优化重排导致Singleton为空的问题
    private static volatile Singleton instance = null;

    // 对外提供公共的访问方式
    public static Singleton getInstance() {

        // 第一次判断如果instance的值不为null，不需要抢占锁直接返回对象，因为读操作本身就是安全的
        if (instance == null) {
            synchronized (Singleton.class) {
                if(instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
